การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk
ครั้งนี้ผมจะมาแนะนำวิธี การใช้ฟังก์ชัน Auto Scaling เพิ่มและลด Instance โดยอัตโนมัติใน Elastic Beanstalk
สิ่งที่ต้องมี
※มีการสร้าง Application, Environment ใน Elastic Beanstalk
※ถ้าเป็น Laravel แนะนำให้สร้าง Environment ตามลิงก์บทความนี้ครับ
หมายเหตุ: ถ้ามีขั้นตอนที่ซ้ำกันให้ข้ามไปได้เลยครับ
ตัวอย่างในบทความนี้ สมมติว่าผมสร้างสภาพแวดล้อมโดยใช้ชื่อดังนี้
Application:tinnakorn
Environment:tinnakorn-autoscale
การตั้งค่า Auto Scaling ขณะสร้าง Environment
ถ้าเรามี Application และ Environment ของเราแล้ว ให้ทำการสร้าง Environment ขึ้นมาใหม่โดยดูวิธีการ Copy Environment ตามลิงก์บทความนี้ได้เลยครับ (การตั้งค่า [Configure more options] ให้ดูที่ขั้นตอน ตัวอย่างการสร้าง Environment ด้านล่างนี้ครับ)
ตัวอย่างการสร้าง Environment
※Environment information
Environment name:tinnakorn-autoscale
(ชื่ออะไรก็ได้)
Domain:tinnakorn-autoscale
(ชื่ออะไรก็ได้)※Platform
Platform:PHP
※Application code
เลือกวิธีอัปโหลดไฟล์ตามที่คุณต้องการ
ต่อไปคือการตั้งค่าในConfigure more options
โดยทำตามหัวข้อดังต่อไปนี้
※หัวข้อ Capacity
คลิกปุ่มEdit
ที่ Capacity แล้วตั้งค่าหัวข้อ Auto scaling group ดังนี้:
» Environment type:Load balanced
» Instances: Min1
, Max6
เลื่อนลงมาที่หัวข้อ Scaling triggers แล้วตั้งค่าดังนี้:
» Metric:CPUUtilization
» Statistic:Average
» Unit:Percent
» Period:1
» Breach duration:1
» Upper threshold:50
Percent
» Lower threshold:10
Percent
» คลิกปุ่มSave
※หัวข้อ Load balancer
คลิกปุ่มEdit
ที่ Load balancer แล้วตั้งค่าหัวข้อ Load balancer type ดังนี้:
» Load balancer type: ◉ Application Load Balancer
เมื่อตั้งค่าตามขั้นตอนด้านบนทุกอย่างเสร็จแล้ว ให้เลื่อนลงมาด้านล่างสุดและคลิกปุ่มCreate environment
จากนั้นรอระบบเริ่มต้นสักครู่ครับ
เมื่อเริ่มต้นระบบเสร็จแล้ว ให้ทำการเปลี่ยนแปลงการตั้งค่า Scaling cooldown ตามขั้นตอนนี้ (ต้องรอจนกว่าการเริ่มต้นระบบเสร็จสิ้นแล้วค่อยทำครับ)
เลือกConfiguration
จากเมนูด้านซ้ายในหน้า Environment ของเรา
ดูที่ด้านขวา คลิกEdit
ที่ Capacity
ดูที่หัวข้อ Auto scaling group แล้วเลื่อนลงมาด้านล่างหาScaling cooldown
และให้ตั้งค่าตามนี้:
» Scaling cooldown:60
seconds
» เลื่อนลงมาด้านล่างสุด คลิกApply
จากนั้นรอระบบ Deploy การเปลี่ยนแปลงการตั้งค่าสักครู่ หลังจากเสร็จแล้วทำขั้นตอนถัดไปได้เลยครับ
ติดตั้ง ab (Apache Bench) ในสภาพแวดล้อมการพัฒนา
Apache Bench เป็นเครื่องมือสำหรับการทดสอบStress Test
โดยสามารถติดตั้งในสภาพแวดล้อมการพัฒนาอื่นที่ไม่เกี่ยวข้องกับ Instance ของ Auto scaling และทำการทดสอบการใช้งานเว็บไซต์ที่ต้องการได้
ติดตั้ง Apache Bench ด้วยคำสั่งนี้ (ให้ติดตั้งใน Server EC2 อื่น เพราะว่าหลังจากทดสอบ ab เสร็จแล้ว Instance ของ Auto scaling จะถูก Terminate โดยอัตโนมัติ)
sudo yum install httpd-tools -y
Apace Bench (ab) usage:
วิธีใช้:ab [options] [http[s]://]hostname[:port]/path
options ที่เราจะใช้ในการทดสอบคือ
ab -n [จำนวนครั้งที่มีการเข้าถึง] -c [จำนวนครั้งที่มีการเข้าถึงพร้อมกัน] [http[s]://]hostname[:port]/path
ทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab
เราจะทำการทดสอบ Environment ที่สร้างใน Elastic Beanstalk ด้วย ab
ก่อนอื่นให้เปิดหน้า Events, Health, Monitoring และ CloudWath เตรียมไว้ เพราะระหว่างการทดสอบเราจะต้องดูการเปลี่ยนแปลงในหน้าเหล่านี้ครับ
※Events
เข้ามาที่ Service Elastic Beanstalk เลือกEvents
ใน Environment ของเรา
ก็จะเห็นสถานะการใช้งานต่างๆ
※Health
เข้ามาที่ Service Elastic Beanstalk เลือกHealth
ใน Environment ของเรา
ก็จะเห็น Instance ID ที่กำลังใช้งานอยู่
※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือกMonitoring
ใน Environment ของเรา
แล้วดูที่กราฟCPU Utilization
สถานะการใช้งานตอนนี้คือปกติ
※CloudWath
เข้ามาที่ Service CloudWatch เลือกAll alarms
จากเมนูด้านซ้าย
และเลือกชื่อ alarms ของเราโดยให้ดูที่ช่วงเวลาที่ Last state update
เมื่อเข้ามาแล้วจะแสดงหน้าจอแบบนี้
CPUUtilization: หาก CPU มีค่ามากกว่า 50% (CPU > 50) ภายใน 1 นาทีจะมีการแจ้งเตือน (Alarm) และเมื่อมีการแจ้งเตือนขึ้นมาแล้ว Instance ก็จะถูกสร้างเพิ่มขึ้นมาอัตโนมัติ
เมื่อดูสถานการณ์จากหน้าจอเหล้านี้แล้วก็จะรู้ช่วงเวลาที่ Instance เพิ่มขึ้นมา ดังนั้นให้เปิดหน้าเหล่านี้ค้างไว้ เพราะจะเริ่มทำการทดสอบในขั้นตอนถัดไปครับ
Run command ทดสอบการเข้าถึงเว็บไซต์ของ Environment
ขั้นตอนนี้ผมจะทำการรันคำสั่ง ab เพื่อทดสอบการเข้าถึงเว็บไซต์ที่สร้างจาก Environment ใน Elastic Beanstalk
ไปที่หน้าเว็บไซต์ที่ใช้งานผ่าน Elastic Beanstalk และ Copy URL โปรเจกต์ของเรามา ในตัวอย่างนี้คือ
http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
แล้วทดสอบการเข้าถึงแค่ 1 ครั้งโดยรันคำสั่งตามนี้ (ab -n 1 -c 1
+your_project_url_eb
)
ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
ถ้ารันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง
Output (example)
root@ip-172-31-29-58:~
[ec2-user@ip-172-31-29-58 html]$ ab -n 1 -c 1 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient).....done
Server Software: nginx/1.20.0
Server Hostname: tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port: 80
Document Path: /customer
Document Length: 754 bytes
Concurrency Level: 1
Time taken for tests: 0.049 seconds
Complete requests: 1
Failed requests: 0
Total transferred: 1824 bytes
HTML transferred: 754 bytes
Requests per second: 20.61 [#/sec] (mean)
Time per request: 48.521 [ms] (mean)
Time per request: 48.521 [ms] (mean, across all concurrent requests)
Transfer rate: 36.71 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 1 0.0 1 1
Processing: 47 47 0.0 47 47
Waiting: 47 47 0.0 47 47
Total: 49 49 0.0 49 49
[ec2-user@ip-172-31-29-58 html]$
เมื่อทดสอบการเข้าถึงแค่ 1 ครั้งได้โดยไม่มี Error ใดๆ ต่อไปให้รันคำสั่งด้านล่างนี้เพื่อทดสอบการเข้าถึง 100000 ครั้งโดยรันคำสั่งตามนี้ (ab -n 100000 -c 6
+your_project_url_eb
)
ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
Output (example)
ถ้ารันคำสั่งไปแล้วไม่แสดงแบบนี้ให้รันคำสั่งเดิมอีกครั้ง
ระหว่างที่ ab กำลังทำงานอยู่ CPUUtilization จะเพิ่มขึ้นเรื่อยๆ และ Instance ก็จะถูกสร้างเพิ่มขึ้นมาโดยอัตโนมัติ
root@ip-172-31-29-58:~
[ec2-user@ip-172-31-29-58 html]$ ab -n 100000 -c 6 http://tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com/customer
This is ApacheBench, Version 2.3
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software: nginx/1.20.0
Server Hostname: tinnakorn-autoscale.ap-southeast-1.elasticbeanstalk.com
Server Port: 80
Document Path: /customer
Document Length: 754 bytes
Concurrency Level: 6
Time taken for tests: 697.033 seconds
Complete requests: 100000
Failed requests: 3
(Connect: 0, Receive: 0, Length: 3, Exceptions: 0)
Total transferred: 182397738 bytes
HTML transferred: 75397738 bytes
Requests per second: 143.47 [#/sec] (mean)
Time per request: 41.822 [ms] (mean)
Time per request: 6.970 [ms] (mean, across all concurrent requests)
Transfer rate: 255.54 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 1 0.5 1 41
Processing: 16 41 65.0 29 1427
Waiting: 16 41 65.0 29 1427
Total: 17 42 65.0 30 1428
Percentage of the requests served within a certain time (ms)
50% 30
66% 37
75% 43
80% 46
90% 56
95% 66
98% 89
99% 269
100% 1428 (longest request)
[ec2-user@ip-172-31-29-58 html]$
เมื่อการทำงานของ ab เสร็จสิ้นแล้ว ให้สังเกตการเปลี่ยนแปลงของ Auto scaling ในขั้นตอนถัดไปครับ
สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนมาก
ขั้นตอนนี้ให้สังเกตการเปลี่ยน Environment ขณะที่มีการเข้าถึงจำนวนมากกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)
※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ของเราและดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น In alarm เนื่องจากว่ามีการใช้งานที่มากกว่า 50% เช่นจากรูปสูงขึ้นมาถึง 90.5% หรืออาจจะสูงกว่านี้ครับ (เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้วสถานะจาก In alarm จะเปลี่ยนเป็น ✅ OK)
※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือก Monitoring ใน Environment ของเราและดูที่ CPU Utilization
จะเห็นว่า CPU Utilization กำลังสูงขึ้นเรื่อยๆ (ในส่วนนี้จะเกิดขึ้นระหว่าง ab กำลังทำงาน)
※Health
เข้ามาที่ Service Elastic Beanstalk เลือก Health ใน Environment ของเราและดูที่ Status
จะเห็นว่าเป็น Status:Warning
ถ้าแสดงข้อความ "1 out of 1 instance are impaces are inpacted. see instance health for details." คือเนื่องจากว่า CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป Auto scaling จึงสร้าง Instance ใหม่ขึ้นมา
เมื่อ Instance ถูกสร้างขึ้นมาเพียงพอต่อการใช้งานแล้ว จะแสดงหน้าจอแบบนี้
การทดสอบครั้งนี้ไม่ว่าจะมีการเข้าถึงเป็นจำนวนมากแค่ไหน Instance ก็จะสร้างขึ้นมาได้สูงสุด 6 Instance เพราะผมตั้งค่า Auto scaling (Instance) ไว้ที่ Max:6
นั่นเอง แต่ครั้งนี้ Instance สร้างขึ้นมาแค่ 4 Instance ก็เพียงพอต่อการใช้งานแล้ว
※Instance
เข้ามาที่ Service EC2 ดูที่หน้า Instance
จะเห็นว่ามี Instance ทั้งหมด 4 ตัวตามที่แสดงใน Health เลยครับ
※Events
เข้ามาที่ Service Elastic Beanstalk เลือก Events ใน Environment ของเราและดูที่ Details
จะเห็นว่ามีรายละเอียดการสร้าง Instance ขึ้นมาใหม่
สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อย
ขั้นตอนนี้ให้สังเกตการเปลี่ยนแปลง Environment ขณะที่มีการเข้าถึงจำนวนน้อยกว่าที่ตั้งค่าไว้ ในตัวอย่างนี้คือ (CPU > 50%)
เมื่อการทำงานของ ab เสร็จสิ้น CPUUtilization จะลดลง และ Instance ก็จะ Terminate ตัวที่ไม่ได้ใช้โดยอัตโนมัติ
※CloudWatch
เข้ามาที่ Service CloudWatch เลือก Alarms ดูที่ Graph
จะเห็นว่า CPUUtilization มีสถานะเป็น ✅ OK เนื่องจากมีการใช้งานที่ต่ำกว่า 50% เช่นจากรูปลดลงมาที่ 0.617% หรืออาจจะต่ำกว่านี้ครับ
※Monitoring
เข้ามาที่ Service Elastic Beanstalk เลือก Monitoring ดูที่ CPU Utilization
จะเห็นว่า CPU Utilization ลดลงมาอยู่ในสถานะปกติแล้ว (ในส่วนนี้จะเกิดขึ้นหลังจาก ap ทำงานเสร็จแล้ว)
※Health
เข้ามาที่ Service Elastic Beanstalk เลือก Health ดูที่ Status
จะเห็นว่าเป็น Status:Warning
ถ้าแสดงข้อความ "No data received from 1 out of 3 instances." คือเนื่องจากว่า CPU Utilization มีการใช้งานที่ลดลงมาต่ำกว่า 50% Auto scaling จึง Terminate Instance ที่ไม่ได้ใช้ออก
เมื่อ Instance ที่ไม่ได้ใช้งานถูก Terminate ออกไปแล้ว จะเหลือแค่ Instance ที่ใช้งานอยู่เท่านั้น
ในตัวอย่างนี้คือจะเหลือ 1 Instance เพราะตัว Auto scaling จะจัดการ Instance ให้เพียงพอต่อการใช้งานให้กับเว็บไซต์ของเรา
※Instance
เข้ามาที่ Service EC2 ดูที่หน้า Instance
จะเห็นว่ามี Instance ที่ไม่ได้ใช้งานถูก Terminate ออกไปทั้งหมด 3 Instance และเหลือ 1 Instance ตามที่แสดงใน Health เลยครับ
※Events
เข้ามาที่ Service Elastic Beanstalk เลือก Events ดูที่ Details
จะเห็นว่ามีรายละเอียดการ Removed Instance ที่ไม่ได้ใช้งานออกไป
ตรวจสอบสถานะของ Instance ใน Server EC2 ด้วย Command
ขั้นตอนนี้ผมจะตรวจสอบสถานะแต่ละ Instance ใน Server EC2 ด้วยคำสั่งtop
ระหว่างทดสอบการทำงานของ ab เราสามารถเข้ามาตรวจสอบสถานะของ Instance ที่นี่ได้
Instance ที่จะตรวจสอบคือ Instance ที่ถูกสร้างขึ้นมาหลังจาก CPU Utilization มีการใช้งานมากกว่า 50% ขึ้นไป
ก่อนอื่นให้ทำการเชื่อมต่อ Server EC2 โดยสามารถศึกษาได้ที่ลิงก์ด้านล่างนี้
ในบทความนี้ผมได้ทำการเชื่อมต่อ Server EC2 ใน VSCode ด้วยวิธีการเชื่อมต่อ EC2 ไปยัง EC2 อื่นครับดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: การเชื่อมต่อ Server EC2
เมื่อเราเชื่อมต่อ Server EC2 ได้แล้วให้รันคำสั่งนี้ใน Terminal ของเราเพื่อตรวจสอบสถานะการใช้งานของ Instance
top
Output (example)
จากรูป เราสามารถเพิ่ม Terminal ใน VSCode และเชื่อมต่อ Server EC2 ได้หลาย Instance ตามที่เราต้องการ
ในตัวอย่างนี้ผมได้เชื่อมต่อไว้ 5 Server (หรือ 5 Instance) คือ
bash
= Instance (tinnakorn-develop) ที่ใช้ติดตั้ง ab และทดสอบการทำงานของ Auto scaling (Instance) ใน Elastic Beanstalk
ssh
= Instance ที่ถูกสร้างใน Elastic Beanstalk ทั้งหมด 4 Server (หรือ 4 Instance)
สรุป
การทำงานของ Auto scaling คือเมื่อมีการเข้าถึง Server มาเป็นจำนวนมากจน CPU Utilization มีการทำงานมากกว่า 50% ขึ้นไป Instance ก็จะถูกสร้างเพิ่มขึ้นมาให้เพียงพอต่อการใช้งาน
ตัวอย่างในบทความนี้ Min คือ 1 Instance เมื่อมีการเข้าถึง Server มาเป็นจำนวนน้อยหรือปกติก็จะเป็น 1 เครื่อง แต่เมื่อมีการเข้าถึง Server มาเป็นจำนวนมาก Instance ก็จะถูกสร้างเพิ่มขึ้นมาได้สูงสุด 6 Server (หรือ 6 Instance) ตามที่เราตั้งค่าไว้นั่นเอง
นอกจากนี้การทำงานของ Instance ที่ควบคุมด้วย Auto scaling จะขึ้นอยู่กับการตั้งค่าและโครงสร้างโปรเจกต์ของคุณด้วยครับ